IR Generation

中间表示树 IR Trees

抽象语法表达式 A_exp

static Tr_exp Tr_Ex(T_exp ex);
static Tr_exp Tr_Nx(T_stm nx);
static Tr_exp Tr_Cx(patchList trues, patchList falses, T_stm stm);

表达式 T_exp

Three-address code

基本块和轨迹

Tree 语言表示的程序和机器语言程序之间存在如下不匹配的情况:

对于任意一颗树,可以将它重写为等价的没有上述任何一种情况的树,转换过程分三步进行:

  1. 将一棵树重写成一列不含 SEQESEQ 结点的 规范树
  2. 将一列树分组组合成其内不含转移和标号的 基本块 集合
  3. 对基本块排序并形成一组 轨迹,轨迹中每一个 CJUMP 之后都直接跟随它的 false 标号

规范树 canonical tree

ESEQ 的转换

Pasted image 20230510222213.png

将 CALL 移到顶层

CALL 的实现是将它的结果返回到同一个规定的返回值寄存器 TEMP(RV) 中,所以像是 BINOP(PLUS,CALL(),CALL()) 的语句都存在冲突,但是可以使用 重写规则 解决

线性语句表

经过上述变换后,将得到一颗树 s0,其中所有的 SEQ 结点都集中在树的顶部,可以将类似 SEQ(SEQ(a,b),c) 的表达式统一转化为 SEQ(a,SEQ(b,c))。最终 线性化 为如下形式的表达式:

SEQ(s1,SEQ(s2,,SEQ(sn1,sn)))

因为 SEQ 结点完全不提供结构化信息,因此可以认为它只是由语句组成的简单列表

s1,s2,,sn1,sn

基本块 basic block

轨迹 trace

Pasted image 20230510223018.png